//
//  global.h
//  LTLBMC
//
//  Created by GD Huang on 5/17/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#ifndef LTLBMC_global_h
#define LTLBMC_global_h

#include <iostream>
#include <functional>
#include <algorithm>

#include "typeinfo.h"
#include "compinfo.h"
#include "enuminfo.h"
#include "initinfo.h"
#include "varinfo.h"
#include "fundec.h"
#include "attribute.h"
#include "location.h"
#include "astVisitor.h"

namespace cilast {
    
    
    class global : public OCamlObject {
    public:
        virtual int accept(astVisitor*);
    };
    
    
    class GType : public global {
    public:    
        typeinfo* mtypeinfo;
        location* mlocation;
        
        int accept(astVisitor* visitor);
    };
    
    class GCompTag : public global {
    public:    
        compinfo* mcompinfo;
        location* mlocation;
        
        int accept(astVisitor* visitor);
    };
    
    class GCompTagDecl : public global {
    public:    
        compinfo* mcompinfo;
        location* mlocation;
        
        int accept(astVisitor* visitor);
    };
    
    class GEnumTag : public global {
    public:    
        enuminfo* menuminfo;
        location* mlocation;
        
        int accept(astVisitor* visitor);
    };
    
    class GEnumTagDecl : public global {
    public:    
        enuminfo* menuminfo;
        location* mlocation;
        
        int accept(astVisitor* visitor);
    };
    
    
    class GVarDecl : public global {
    public:    
        varinfo* mvarinfo;
        location* mlocation;
        
        int accept(astVisitor* visitor);
    };
    
    class GVar : public global {
    public:    
        varinfo* mvarinfo;
        initinfo* minitinfo;
        location* mlocation;
        
        int accept(astVisitor* visitor);
        
    };
    
    
    class GFun : public global {
    public:    
        fundec* mfundec;
        location* mlocation;
        
        int accept(astVisitor* visitor);
    };
    
    class GAsm : public global {
    public:    
        char* mstr;
        location* mlocation;
        
        int accept(astVisitor* visitor);
    };
    
    class GPragma : public global {
    public:    
        attribute* mattribute;
        location* mlocation;
        
        int accept(astVisitor* visitor);
    };
    
    class GText : public global {
    public:    
        char* mstr;
        
        int accept(astVisitor* visitor);
    };
    
    
    
}

#endif
